home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / libraris / odinlib1 / part01 / odintest.c < prev    next >
C/C++ Source or Header  |  1990-09-03  |  5KB  |  213 lines

  1. /***********************************************************
  2. * odintest.c                                               *
  3. * Created 12-jul-90 by Peter Oerbaek                       *
  4. * This is supposed to be a complete test-suite of the      *
  5. * functions in odin.library                                *
  6. * Modified 13-jul-90 for ANSI compatibility                *
  7. * Compiles and runs under both Aztec C 3.40a and PDC 3.33  *
  8. ************************************************************/
  9.  
  10. #include    "exec/types.h"
  11. #include    "exec/tasks.h"
  12. #include    "exec/semaphores.h"
  13. #include    "exec/execbase.h"
  14. #include    "odin.h"
  15. #include    "stdio.h"
  16.  
  17. void *OpenLibrary();
  18. struct Task *FindTask();
  19.  
  20. struct OdinBase *OdinBase;
  21. struct SignalSemaphore ss;
  22. #define CR(s) ObtainSemaphore(&ss); { s } ReleaseSemaphore(&ss);
  23. #define debug(str) CR(printf(str);)
  24.  
  25. Envelope e1,e2;
  26.  
  27. Envelope *my_copyfunc(src,tar)
  28. Envelope *src,*tar;
  29. {
  30.     int i;
  31.     register char *a,*b;
  32.  
  33.     a = (char *)src; b = (char *)tar;
  34.     for(i = 0; i < e_sizeof; i++) {
  35.         *a++ = *b++;
  36.     }
  37.  
  38.     return tar;
  39. }
  40.  
  41. Envelope *process1(e)
  42. Envelope *e;
  43. {
  44.     struct Task *tsk;
  45.     Envelope *env;
  46.  
  47.     debug("process1 started\n");
  48.     CR(printf("lenght = %ld\n",e->e_len);)
  49.  
  50.     tsk = FindTask(NULL);
  51.     
  52.     CR(printf("stacksize = %d\n",(int)(tsk->tc_SPUpper - tsk->tc_SPLower));)
  53.     CR(printf("pri = %d\n",(int)tsk->tc_Node.ln_Pri);)
  54.     CR(printf("taskname=%s\n",tsk->tc_Node.ln_Name);)
  55.  
  56.     debug("creating envelope\n");
  57.     env = CreateEnvelope("Env2",e_sizeof);
  58.     if(env == NULL) { debug("create returned NULL\n"); return e; }
  59.  
  60.     debug("envelope created\n");
  61.  
  62.     Delay(100L);
  63.     debug("copyouting\n");
  64.     CopyOut(env);
  65.  
  66.     Delay(199L);
  67.     debug("copy outing with copyfunc\n");
  68.     env->e_copyfunc = my_copyfunc;
  69.     CopyOut(env);
  70.  
  71.     debug("normal out\n");
  72.     Out(env);
  73.  
  74.     debug("wait for V3\n");
  75.     while(!(env = PollNamedEnvelope("V3"))) { 
  76.         debug("waiting with poll.\n");
  77.     }
  78.  
  79.     debug("got V3 dispose\n");
  80.     DisposeEnvelope(env);
  81.  
  82.     debug("wait for V4 and dispose\n");
  83.     DisposeEnvelope(AwaitNamedEnvelope("V4"));
  84.  
  85.     debug("wait for task1\n");
  86.     DisposeEnvelope(AwaitNamedEnvelope("V5"));
  87.     debug("shake hands\n");
  88.     OutEmptyEnvelope("R1");
  89.  
  90.     Delay(100L);
  91.     return e;
  92. }
  93.  
  94. void task1()
  95. {
  96.     OutEmptyEnvelope("V5");    /* shake hands with process */
  97.     DisposeEnvelope(AwaitNamedEnvelope("R1"));
  98. }
  99.  
  100. main()
  101. {
  102.     Envelope *ptr;
  103.     struct Task *tsk;
  104.  
  105.     if(!(OdinBase = (struct OdinBase *)OpenLibrary("RAM:odin.library",0L)))
  106.     {
  107.         printf("couldn't find odin.library.\n");
  108.         exit(20);
  109.     }
  110.  
  111.     InitSemaphore(&ss);
  112.  
  113.     debug("begin\n");
  114.  
  115.     debug("test InitEnvelope():\n");
  116.     ptr = InitEnvelope(&e1,"Test",e_sizeof,NoCopyFunc);
  117.     debug("init envelope finished\n");
  118.     if(ptr == &e1) {
  119.         debug("returnvalue ok.\n");
  120.         if(strcmp(ptr->e_name,"Test") == 0) {
  121.             debug("name inited ok\n");
  122.         } else {
  123.             debug("name wrong\n");
  124.         }
  125.         if(ptr->e_len == e_sizeof && ptr->e_copyfunc == NULL) {
  126.             debug("inited ok\n");
  127.         } else {
  128.             debug("wrong init\n");
  129.         }
  130.     } else {
  131.         debug("returned wrong value.\n");
  132.     }
  133.  
  134.  
  135.     debug("test Eval():\n");
  136.     e1.e_proc = process1;
  137.     (void)Eval(&e1,(long)0,(ULONG)4000,EVAL_PROCESS);
  138.     debug("eval finished\n");
  139.  
  140.     debug("test rdp\n");
  141.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  142.     while(!(ptr = Rdp(&e2))) { debug("waiting in rdp\n"); }
  143.     if(ptr == &e2) {
  144.         debug("rdp returned ok\n");
  145.     } else {
  146.         debug("rdp returned wrong\n");
  147.     }
  148.     CR(printf("name returned by rdp: %s\n",e2.e_name);)
  149.  
  150.     debug("test rd\n");
  151.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  152.     ptr = Rd(&e2);
  153.     if(ptr == &e2) {
  154.         debug("rd returned ok\n");
  155.     } else {
  156.         debug("rd returned wrong\n");
  157.     }
  158.     CR(printf("name returned by rd: %s\n",ptr->e_name);)
  159.  
  160.     debug("test In()\n");
  161.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  162.     ptr = In(&e2);
  163.     if(ptr != &e2) {
  164.         debug("in returned ok\n");
  165.     } else {
  166.         debug("in returned wrong\n");
  167.     }
  168.     CR(printf("name returned by in: %s\n",ptr->e_name);)
  169.     DisposeEnvelope(ptr);
  170.  
  171.     debug("test AwaitNamedEnvelope()\n");
  172.     ptr = AwaitNamedEnvelope("Env2");
  173.     CR(printf("name returned by Await..: %s\n",ptr->e_name);)
  174.     DisposeEnvelope(ptr);
  175.  
  176.     debug("test rdp with copyfunc\n");
  177.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  178.     while(!(ptr = Rdp(&e2))) { debug("waiting in rdp2\n"); }
  179.     if(ptr == &e2) {
  180.         debug("rdp2 returned ok\n");
  181.     } else {
  182.         debug("rdp2 returned wrong\n");
  183.     }
  184.     CR(printf("name returned by rdp2: %s\n",e2.e_name);)
  185.  
  186.     debug("rd with copyfunc\n");
  187.     (void)InitEnvelope(&e2,"Env2",e_sizeof,NoCopyFunc);
  188.     ptr = Rd(&e2);
  189.     if(ptr == &e2) {
  190.         debug("rd2 returned ok\n");
  191.     } else {
  192.         debug("rd2 returned wrong\n");
  193.     }
  194.     CR(printf("name returned by rd2: %s\n",e2.e_name);)
  195.  
  196.     DisposeEnvelope(AwaitNamedEnvelope("Env2"));
  197.  
  198.     Delay(100L);
  199.     Out(CreateEnvelope("V3",e_sizeof));
  200.  
  201.     OutEmptyEnvelope("V4");
  202.  
  203.     tsk = StartTask(task1,"TAsk1",0L,4000L);
  204.     if(tsk == NULL) { debug("couldn't start task\n"); }
  205.     debug("task started\n");
  206.  
  207.     debug("wait for process to die\n");
  208.     (void)AwaitNamedEnvelope("Test");    
  209.  
  210.     CloseLibrary(OdinBase);
  211. }
  212.  
  213.